/**
 * 题库数据导入脚本
 * 将现有的题库数据导入到Supabase数据库
 */

const fs = require('fs');
const path = require('path');

// 模拟Supabase客户端（实际使用时需要配置真实的Supabase连接）
class MockSupabaseClient {
  constructor() {
    this.data = {
      topics: [],
      questions: []
    };
  }

  async insertTopics(topics) {
    console.log(`准备插入 ${topics.length} 个知识点...`);
    this.data.topics = topics;
    return { data: topics, error: null };
  }

  async insertQuestions(questions) {
    console.log(`准备插入 ${questions.length} 道题目...`);
    this.data.questions = questions;
    return { data: questions, error: null };
  }

  getData() {
    return this.data;
  }
}

// 读取现有题库数据
function loadQuestionBank() {
  try {
    const questionBankPath = path.join(__dirname, '../../题库/extended-question-bank.ts');
    const content = fs.readFileSync(questionBankPath, 'utf8');
    
    // 简单的解析（实际项目中可能需要更复杂的解析）
    console.log('题库文件读取成功');
    return content;
  } catch (error) {
    console.error('读取题库文件失败:', error.message);
    return null;
  }
}

// 解析题库数据并转换为数据库格式
function parseQuestionBank(content) {
  const topics = [];
  const questions = [];

  // 定义知识点映射
  const topicMappings = {
    '鸡兔同笼': {
      name: '鸡兔同笼',
      description: '经典的鸡兔同笼问题，培养学生的逻辑思维和解题技巧',
      grade_levels: [3, 4, 5, 6], // 小学3-5年级，初中1年级
      difficulty: 2,
      example_problem: '鸡兔同笼，共有头35个，脚94只，问鸡兔各多少只？',
      example_solution: '假设35只全是鸡，应有脚35×2=70只，实际有94只，多了94-70=24只脚。每只兔比鸡多2只脚，所以兔有24÷2=12只，鸡有35-12=23只。'
    },
    '和差倍问题': {
      name: '和差倍问题',
      description: '通过和、差、倍数关系求解未知数的问题',
      grade_levels: [2, 3, 4, 5, 6],
      difficulty: 2,
      example_problem: '甲乙两数的和是48，差是28，求甲乙两数。',
      example_solution: '甲=(和+差)÷2=(48+28)÷2=38，乙=(和-差)÷2=(48-28)÷2=10'
    },
    '年龄问题': {
      name: '年龄问题',
      description: '利用年龄关系和时间变化解决的数学问题',
      grade_levels: [3, 4, 5, 6, 7],
      difficulty: 3,
      example_problem: '爸爸今年39岁，儿子今年9岁，几年后爸爸的年龄是儿子年龄的3倍？',
      example_solution: '设x年后，39+x=3(9+x)，解得x=6年'
    },
    '平均数问题': {
      name: '平均数问题',
      description: '关于平均数计算和应用的数学问题',
      grade_levels: [4, 5, 6, 7, 8],
      difficulty: 2,
      example_problem: '小华5次数学测验的平均分是92分，前4次的平均分是90分，第5次考了多少分？',
      example_solution: '5次总分=92×5=460分，前4次总分=90×4=360分，第5次=460-360=100分'
    }
  };

  // 生成知识点数据
  let topicIndex = 0;
  for (const [topicName, topicInfo] of Object.entries(topicMappings)) {
    topics.push({
      id: `topic-${topicIndex + 1}`,
      name: topicInfo.name,
      description: topicInfo.description,
      grade_levels: topicInfo.grade_levels,
      difficulty: topicInfo.difficulty,
      example_problem: topicInfo.example_problem,
      example_solution: topicInfo.example_solution,
      order_index: topicIndex
    });
    topicIndex++;
  }

  // 模拟题目数据（实际项目中需要解析真实的题库文件）
  const sampleQuestions = [
    {
      topic_name: '鸡兔同笼',
      stem: '鸡兔同笼，共有头35个，脚94只，问鸡兔各多少只？',
      answer: [23, 12],
      difficulty: 2,
      hint1: '假设全是鸡，计算脚数差异',
      hint2: '每只兔比鸡多2只脚',
      solution: '假设35只全是鸡，应有脚35×2=70只，实际有94只，多了94-70=24只脚。每只兔比鸡多2只脚，所以兔有24÷2=12只，鸡有35-12=23只。'
    },
    {
      topic_name: '和差倍问题',
      stem: '甲乙两数的和是48，差是28，求甲乙两数。',
      answer: [38, 10],
      difficulty: 1,
      hint1: '利用和差求两数的公式',
      hint2: '甲=(48+28)÷2=38，乙=(48-28)÷2=10',
      solution: '根据和差求两数：甲=(和+差)÷2=(48+28)÷2=38，乙=(和-差)÷2=(48-28)÷2=10'
    }
  ];

  // 生成题目数据
  let questionIndex = 0;
  for (const question of sampleQuestions) {
    const topic = topics.find(t => t.name === question.topic_name);
    if (topic) {
      questions.push({
        id: `question-${questionIndex + 1}`,
        topic_id: topic.id,
        stem: question.stem,
        answer: question.answer,
        difficulty: question.difficulty,
        hint1: question.hint1,
        hint2: question.hint2,
        solution: question.solution,
        order_index: questionIndex
      });
      questionIndex++;
    }
  }

  return { topics, questions };
}

// 主函数
async function main() {
  console.log('🚀 开始导入题库数据...\n');

  // 1. 读取题库文件
  const content = loadQuestionBank();
  if (!content) {
    console.error('❌ 无法读取题库文件，导入终止');
    return;
  }

  // 2. 解析数据
  console.log('📊 解析题库数据...');
  const { topics, questions } = parseQuestionBank(content);
  console.log(`✅ 解析完成: ${topics.length} 个知识点, ${questions.length} 道题目\n`);

  // 3. 连接数据库（模拟）
  const supabase = new MockSupabaseClient();

  // 4. 导入知识点
  console.log('📝 导入知识点...');
  const topicsResult = await supabase.insertTopics(topics);
  if (topicsResult.error) {
    console.error('❌ 知识点导入失败:', topicsResult.error);
    return;
  }
  console.log('✅ 知识点导入成功\n');

  // 5. 导入题目
  console.log('📚 导入题目...');
  const questionsResult = await supabase.insertQuestions(questions);
  if (questionsResult.error) {
    console.error('❌ 题目导入失败:', questionsResult.error);
    return;
  }
  console.log('✅ 题目导入成功\n');

  // 6. 显示导入结果
  console.log('🎉 数据导入完成！');
  console.log('📊 导入统计:');
  console.log(`   - 知识点: ${topics.length} 个`);
  console.log(`   - 题目: ${questions.length} 道`);
  
  // 7. 保存导入结果到文件（用于调试）
  const result = supabase.getData();
  fs.writeFileSync(
    path.join(__dirname, '../database/import-result.json'),
    JSON.stringify(result, null, 2),
    'utf8'
  );
  console.log('💾 导入结果已保存到 database/import-result.json');
}

// 运行脚本
if (require.main === module) {
  main().catch(console.error);
}

module.exports = { parseQuestionBank, loadQuestionBank };
